#include "ModuleSlice.h"

void ModuleSlice::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();
  layout=new QVBoxLayout(win);

	sb_getChroma=new QSpinBox(win);
	sb_getChroma->setPrefix(tr("Teinte="));
	sb_getChroma->setRange(0,255);
	
	sb_res=new QSpinBox(win);
	sb_res->setPrefix(trUtf8("Résolution="));
	sb_res->setRange(64,512);
	sb_res->setValue(256);

	pb_send=new QPushButton(tr("Envoyer"),win);

	layout->addWidget(sb_res);
	layout->addWidget(sb_getChroma);
	layout->addWidget(pb_send);

	slice.create(sb_res->value(),sb_res->value(),CV_8UC3);
	slice.setTo(cv::Scalar(255,255,255));

	parent->setAutoProcess(false);

	connect(sb_getChroma,SIGNAL(valueChanged(int)),this,SLOT(s_chromaChanged(int)));
	connect(sb_res,SIGNAL(valueChanged(int)),this,SLOT(s_resChanged(int)));
	connect(pb_send,SIGNAL(clicked()),this,SLOT(s_send()));
	s_chromaChanged(0);
}
////////////////////////////////////////////////////////////////////////////////
void ModuleSlice::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleSlice::process()
{
	std::cout<<"Erreur ModuleSlice : process ne doit pas etre executé\n";
}
////////////////////////////////////////////////////////////////////////////////
void ModuleSlice::setInput(int n,const cv::Mat & m)
{

}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleSlice::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleSlice::getName()
{
	return tr("Tranche Saturation - Brillance / Teinte");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleSlice::nbInputs()
{
	return 0;
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleSlice::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==1)
	{
		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleSlice::getParams()
{
	return tr("no_param");
}

////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModuleSlice::clone()
{
	return new ModuleSlice;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleSlice::help(int id)
{
	if(id==-2)
	{
		return tr("Retourne une tranche Saturation - Brillance en fonction d'une teinte");
	}
	else if(id==-1)
	{
		return tr("image");
	}
	else if(id==0)
	{
		return tr("image");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModuleSlice::getChromaSlice(unsigned char T,cv::Mat & slice)
{
	for(int l=0;l<slice.rows;l++)
	{
		for(int c=0;c<slice.cols;c++)
		{
			float H=(float)T/255.0;
			float S=(float)l/slice.rows;
			float L=(float)c/slice.rows;


			//Convertion de HSL --> RGB
			unsigned char R=0,G=0,B=0;
			float var1=0.0,var2=0.0;

			if(S==0)
			{
				R=L*255.0;
				G=L*255.0;
				B=L*255.0;
			}
			else
			{
				if(L<0.5){var2=L*(1+S);}
				else{var2=(L+S)-(S*L);}
				var1=2*L-var2;
				R=255.0*HUE_2_RGB(var1,var2,H+(1.0/3.0));
				G=255.0*HUE_2_RGB(var1,var2,H);
				B=255.0*HUE_2_RGB(var1,var2,H-(1.0/3.0));
			}

			

			slice.at<cv::Vec3b>(slice.rows-1-l,c)=cv::Vec3b(R,G,B);
		}
	}
}

float ModuleSlice::HUE_2_RGB(float v1,float v2,float H)
{
	if(H<0)H+=1;
	if(H>1)H-=1;
	if((6*H)<1){return v1+(v2-v1)*6*H;}
	if((2*H)<1){return v2;}
	if((3*H)<2){return v1+(v2-v1)*((2.0/3.0)-H)*6;}
	return v1;	
}
////////////////////////////////////////////////////////////////////////////////
void ModuleSlice::s_chromaChanged(int chroma)
{
	getChromaSlice(chroma,slice);
	parent->forceOutput(slice);
}
////////////////////////////////////////////////////////////////////////////////
void ModuleSlice::s_resChanged(int res)
{
	slice.release();
	slice.create(res,res,CV_8UC3);
	s_chromaChanged(sb_getChroma->value());
}

void ModuleSlice::s_send()
{
	parent->forceOutput(slice);
}
Q_EXPORT_PLUGIN2(ModuleSlice_plugin,ModuleSlice);  
